package com.lmaos.basetools.group;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import com.lmaos.allcontrol.beancontrol.field_.FieldUtils;
import com.lmaos.basetools.base.SDataKey;
import com.lmaos.basetools.base.calculate.SCalculate;
import com.lmaos.basetools.sText.TextUtils;
/** 数据分组
 * 
 */
/** 数据分组
 * 
 */
public class SDataGroup {
	/**
	 * 说明：转换key为String的map		<br>
	 * 时间：2017年7月24日 下午5:56:21
	 *
	 * @param map
	 * @return
	 */
	public static <T> Map<String, List<T>> toMap(Map<SDataKey, List<T>> map){
		 Map<String, List<T>> nmap = new HashMap<String, List<T>>();
		 for(Entry<SDataKey, List<T>> entry : map.entrySet()){
			 nmap.put(entry.getKey().toString(), entry.getValue());
		 }
		 return nmap;
	}
	/** 2017-07-19
	 * @param <T>
	 * 
	 * @param colls 需要分组的集合
	 * @param field_key  分组 key
	 * @param field_keys 更多联合分组 key
	 * @return
	 */
	public static <T> Map<SDataKey, List<T>> group(Collection<T> colls,String field_key,String... field_keys){
		
		String[] fields = toStringArray(field_key, field_keys);
		
		Map<SDataKey, List<T>> map = new HashMap<SDataKey, List<T>>();
		for (T coll : colls) {
			Object[] values = new Object[fields.length];
			for (int i = 0;i<values.length;i++) 
			{
				String field = fields[i];
				values[i] = FieldUtils.getFieldValue(coll, field);
			}
			SDataKey dataKey = new SDataKey(values);
			List<T> list = map.get(dataKey);
			if(list == null){
				list = new ArrayList<T>();
				map.put(dataKey, list);
			}
			list.add(coll);
		}
		return map;
	}
	/** 分组并统计
	 * 
	 * @param colls
	 * @param format			计算格式化
	 * @param specialValues 其他特别的值 值字段为#开头
	 * @param ruleValues    规则值，定义字段值转换为当前值 key = field.value
	 * @param field_key		分组key
	 * @param field_keys	其他更多分组key
	 * @return
	 */
	public static <T> Map<SDataKey, Double> groupCount(Collection<T> colls,String format, Map<String, Double> specialValues, Map<String, Double> ruleValues,String field_key,String... field_keys){
		Map<SDataKey, List<T>> groupData = group(colls, field_key, field_keys);
		return count(groupData, format, specialValues, ruleValues);
	}
	/**
	 * 
	 * @param <T>
	 * @param group
	 * @param format 分组数据整理
	 * @param specialValues 其他特别的值 值字段为#开头
	 * @param ruleValues    规则值，定义字段值转换为当前值 key = field.value
	 * @return
	 */
	public static <T> Map<SDataKey, Double> count(Map<SDataKey, List<T>> group,String format, Map<String, Double> specialValues, Map<String, Double> ruleValues){
		Map<SDataKey, Double> result = new HashMap<SDataKey, Double>();
		SCalculate calculate = new SCalculate(SCalculate.TYPE_JAVASCRIPT);
		for(Entry<SDataKey, List<T>> entry: group.entrySet()){
			List<T> list = entry.getValue();
			double value = calculate.calculate(list, format, specialValues, ruleValues);
			result.put(entry.getKey(), value);
		}
		return result;
	}
	public static <T> Map<SDataKey, Double> count(Map<SDataKey, List<T>> group,String format){
		return count(group, format, null, null);
	}
	
	
	public static String[] toStringArray(String str,String...strs){
		String ss[] = null;
		if(strs == null||strs.length==0){
			if(str == null){
				ss = new String[0];
			}else{
				ss = new String[]{str};
			}
		}else{
			if(str == null){
				ss = new String[strs.length];
				System.arraycopy(strs, 0, ss, 0, strs.length);
			}else{
				ss = new String[strs.length+1];
				ss[0]=str;
				System.arraycopy(strs, 0, ss, 1, strs.length);
			}
		}
		return ss;
	}
}

